#include "java_types.hpp"

namespace mbgl {
namespace android {
namespace java {

jni::jclass* ObjectArray::jclass;

jni::jclass* String::jclass;

jni::jclass* Boolean::jclass;
jni::jmethodID* Boolean::booleanValueMethodId;

jni::jclass* Number::jclass;
jni::jmethodID* Number::floatValueMethodId;
jni::jmethodID* Number::doubleValueMethodId;
jni::jmethodID* Number::longValueMethodId;

jni::jclass* Map::jclass;
jni::jmethodID* Map::getMethodId;
jni::jmethodID* Map::keySetMethodId;

jni::jclass* Set::jclass;
jni::jmethodID* Set::toArrayMethodId;

void registerNatives(JNIEnv& env) {
    ObjectArray::jclass = jni::NewGlobalRef(env, &jni::FindClass(env, "[Ljava/lang/Object;")).release();

    String::jclass = jni::NewGlobalRef(env, &jni::FindClass(env, "java/lang/String")).release();

    Boolean::jclass = jni::NewGlobalRef(env, &jni::FindClass(env, "java/lang/Boolean")).release();
    Boolean::booleanValueMethodId = &jni::GetMethodID(env, *Boolean::jclass, "booleanValue", "()Z");

    Number::jclass = jni::NewGlobalRef(env, &jni::FindClass(env, "java/lang/Number")).release();
    Number::floatValueMethodId = &jni::GetMethodID(env, *Number::jclass, "floatValue", "()F");
    Number::doubleValueMethodId = &jni::GetMethodID(env, *Number::jclass, "doubleValue", "()D");
    Number::longValueMethodId = &jni::GetMethodID(env, *Number::jclass, "longValue", "()J");

    Map::jclass = jni::NewGlobalRef(env, &jni::FindClass(env, "java/util/Map")).release();
    Map::getMethodId = &jni::GetMethodID(env, *Map::jclass, "get", "(Ljava/lang/Object;)Ljava/lang/Object;");
    Map::keySetMethodId = &jni::GetMethodID(env, *Map::jclass, "keySet", "()Ljava/util/Set;");

    Set::jclass = jni::NewGlobalRef(env, &jni::FindClass(env, "java/util/Set")).release();
    Set::toArrayMethodId = &jni::GetMethodID(env, *Set::jclass, "toArray", "()[Ljava/lang/Object;");
}

} // namespace java
} // namespace android
} // namespace mbgl
